package com.erp.erp_ui.warehouse.controller;

import com.alibaba.fastjson.JSONObject;
import com.erp.enums.DictionaryLxEnum;
import com.erp.enums.DictionaryTypeEnum;
import com.erp.erp_entitys.User.UserEntity;
import com.erp.erp_entitys.warehouse.req.DictionaryInfoReq;
import com.erp.erp_entitys.warehouse.req.ImportPurchaseSampleReq;
import com.erp.erp_entitys.warehouse.rsp.ImportPurchaseSampleProductRsp;
import com.erp.erp_entitys.warehouse.rsp.ImportPurchaseSampleRsp;
import com.erp.erp_ui.base.Base;
import com.erp.erp_ui.warehouse.req.*;
import com.erp.erp_ui.warehouse.service.ResourceSamplesService;
import com.erp.erp_ui.warehouse.vo.*;
import com.erp.utils.R;
import com.erp.utils.ResultStatusEnum;
import com.github.pagehelper.PageInfo;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * @ClassName : ResourceSamplesController
 * @Description : 资源样品控制层
 * @Author : lst
 * @Date: 2020-11-28 16:07
 */
@Controller
@RequestMapping(value = "resourceSamples")
public class ResourceSamplesController extends Base {

    /**
     * 日志
     */
    private static final Logger LOGGER = LoggerFactory.getLogger(InitStockController.class);

    /**
     * 资源样品业务逻辑层
     */
    private final ResourceSamplesService resourceSamplesService;

    @Autowired
    public ResourceSamplesController(ResourceSamplesService resourceSamplesService) {
        this.resourceSamplesService = resourceSamplesService;
    }

    /**
     * 首页-获取分页信息
     * @param req 查询条件实体
     * @return
     */
    @GetMapping("/getResourceSamplesListByPage")
    @ResponseBody
    public R getResourceSamplesListByPage(ResourceSamplesPageListReq req){
        try {
            LOGGER.info("资源样品-首页-获取分页信息:" + req.toString());
            PageInfo<ResourceSamplesPageListVo> pageInfo = resourceSamplesService.getResourceSamplesListByPage(req);
            return R.build(0,"", pageInfo.getTotal(), pageInfo.getList());
        }catch (Exception e){
            LOGGER.info("资源样品-首页-获取分页信息异常:" + e);
            return R.buildError(ResultStatusEnum.SYSTEM_ERROR);
        }
    }

    /**
     * 首页-获取资源样品库存分页信息
     * @param req 查询条件实体
     * @return
     */
    @GetMapping("/getResourceSamplesStockListByPage")
    @ResponseBody
    public R getResourceSamplesStockListByPage(ResourceSamplesStockPageListReq req){
        try {
            LOGGER.info("资源样品-首页-获取资源样品库存分页信息:" + req.toString());
            PageInfo<ResourceSamplesStockPageListVo> pageInfo = resourceSamplesService.getResourceSamplesStockListByPage(req);
            return R.build(0,"", pageInfo.getTotal(), pageInfo.getList());
        }catch (Exception e){
            LOGGER.info("资源样品-首页-获取资源样品库存分页信息异常:" + e);
            return R.buildError(ResultStatusEnum.SYSTEM_ERROR);
        }
    }

    /**
     * 仓库管理-资源样品-登记新增、修改
     * @param req 新增、修改数据实体
     * @return 新增、修改结果
     */
    @PostMapping("/add/register")
    @ResponseBody
    public R addRegister(@Validated @RequestBody AddResourceSamplesReq req){
        LOGGER.info("仓库管理-资源样品-登记新增、修改 req=" + req.toString());
        try {
            UserEntity user = (UserEntity)this.getBean("user");
            String name = user.getName();
            String code = user.getCode();
            return resourceSamplesService.add(req, name, code);
        }catch (Exception e){
            LOGGER.info("仓库管理-资源样品-登记新增、修改异常：" + e);
            return R.buildError(ResultStatusEnum.SYSTEM_ERROR);
        }
    }


    /**
     * 仓库管理-资源样品-查看详情
     * @param id 资源样品id
     * @return 详情对象
     */
    @PostMapping("/detail")
    @ResponseBody
    public R getDetailInfo(@RequestBody Integer id){
        try {
            LOGGER.info("资源样品-查看详情、修改 id=" + id);
            ResourceSamplesDetailVo vo = resourceSamplesService.getDetailInfo(id);
            return R.build(vo);
        }catch (Exception e){
            LOGGER.info("资源样品-查看详情、修改异常:" + e);
            return R.buildError(ResultStatusEnum.SYSTEM_ERROR);
        }
    }

    /**
     * 仓库管理-资源样品-批量领出
     * @param id 资源样品登记id
     * @return 批量登记对象
     */
    @PostMapping("/getBatchRegisterDetail")
    @ResponseBody
    public R getBatchRegisterDetail(@RequestBody String id){
        try {
            LOGGER.info("资源样品-批量领出 id=" + id);
            List<ImportResourceSamplesVo> voList = resourceSamplesService.getBatchRegisterDetail(id);
            return R.build(voList);
        }catch (Exception e){
            LOGGER.info("资源样品-批量领出异常:" + e);
            return R.buildError(ResultStatusEnum.SYSTEM_ERROR);
        }
    }

    /**
     * 获取资源仓库信息
     * @return
     */
    @GetMapping("/getResourceWarehouseInfo")
    @ResponseBody
    public R getWarehouse(){
        try {
            LOGGER.info("仓库管理-资源样品-获取仓库字典信息");
            //获取所有资源仓库字典信息
            DictionaryInfoReq dictionaryInfosReq = new DictionaryInfoReq();
            //仓库维护
            dictionaryInfosReq.setType(DictionaryTypeEnum.WAREHOUSE_MAINTENANCE.getId());
            //主仓库维护
            dictionaryInfosReq.setLx(DictionaryLxEnum.RESOURCE_SAMPLES_WAREHOUSE_MAINTENANCE.getId());
            List<DictionaryInfoVo> warehouseInfos = resourceSamplesService.getDictionaryInfo(dictionaryInfosReq);
            return R.build(warehouseInfos);
        }catch (Exception e){
            LOGGER.info("仓库管理-资源样品-获取仓库字典信息异常:" + e);
            return R.buildError(ResultStatusEnum.SYSTEM_ERROR);
        }
    }

    /**
     * 获取字典信息-数量单位
     * @return 数量单位
     */
    @GetMapping("/getUnitOfQuantityInfo")
    @ResponseBody
    public R getUnitOfQuantityInfo(){
        try {
            LOGGER.info("仓库管理-资源样品-获取字典信息-数量单位信息");
            //获取所有资源仓库字典信息
            DictionaryInfoReq dictionaryInfosReq = new DictionaryInfoReq();
            //仓库维护
            dictionaryInfosReq.setType(DictionaryTypeEnum.COMMODITY_INFO.getId());
            //主仓库维护
            dictionaryInfosReq.setLx(DictionaryLxEnum.UNIT_OF_QUANTITY.getId());
            List<DictionaryInfoVo> dictionaryInfos = resourceSamplesService.getDictionaryInfo(dictionaryInfosReq);
            return R.build(dictionaryInfos);
        }catch (Exception e){
            LOGGER.info("仓库管理-资源样品-获取字典信息-数量单位信息异常:" + e);
            return R.buildError(ResultStatusEnum.SYSTEM_ERROR);
        }
    }

    /**
     * 仓库管理-资源样品-领出-导入资源仓库信息
     * @param req 查询条件
     * @return 产品集合
     */
    @GetMapping("/takeOut/add/getProductInfoByPage")
    @ResponseBody
    public R getTakeOutProductInfoByPage(ImportResourceSamplesReq req){
        try {
            LOGGER.info("仓库管理-初始化-获取产品分页信息 req =" + req.toString());
            PageInfo<ImportResourceSamplesVo> pageInfo = resourceSamplesService.getTakeOutProductInfoByPage(req);
            return R.build(0, "", pageInfo.getTotal(), pageInfo.getList());
        }catch (Exception e){
            LOGGER.info("仓库管理-初始化-获取产品分页信息异常：" + e);
            return R.buildError(ResultStatusEnum.SYSTEM_ERROR);
        }
    }

    /**
     * 资源样品删除
     * @param req
     * @return
     */
    @PostMapping("/delete")
    @ResponseBody
    public R deleteInventoryInfo(@RequestBody OperationReq req){
        try {
            LOGGER.info("仓库管理-资源样品-删除信息 req=" + req);
            resourceSamplesService.delete(req.getId(), req.getStatus());
            return R.build("");
        }catch (Exception e){
            LOGGER.info("仓库管理-资源样品-删除信息异常:" + e);
            return R.buildError(ResultStatusEnum.SYSTEM_ERROR);
        }

    }

    /**
     * 数据操作接口
     * @param req
     * @return
     */
    @PostMapping("/operation")
    @ResponseBody
    public R operation(@RequestBody OperationReq req){
        try {
            LOGGER.info("仓库管理-资源样品-数据操作接口 req=" + req);
            return resourceSamplesService.operation(req.getId(), req.getType(), req.getOperation());
        }catch (Exception e){
            LOGGER.info("仓库管理-资源样品-数据操作接口异常:" + e);
            return R.buildError(ResultStatusEnum.SYSTEM_ERROR);
        }
    }

    /**
     * 导入采购样品主信息
     *
     * @param req 查询参数
     * @return 采购样品主信息
     */
    @GetMapping("/import/getPurchaseSampleInfoByPage")
    @ResponseBody
    public R getPurchaseSampleInfoByPage(ImportPurchaseSampleReq req) {
        try {
            LOGGER.info("仓库管理-资源样品-导入采购样品主信息 req=" + req);
            PageInfo<ImportPurchaseSampleRsp> pageInfo = resourceSamplesService.getPurchaseSampleInfoByPage(req);
            return R.build(0, "", pageInfo.getTotal(), pageInfo.getList());
        } catch (Exception e) {
            LOGGER.info("仓库管理-资源样品-导入采购样品主信息异常:" + e);
            return R.buildError(ResultStatusEnum.SYSTEM_ERROR);
        }
    }

    /**
     * 通过采购样品主ID获取对应产品信息
     *
     * @param id 采购样品主ID
     * @return 采购样品产品信息
     */
    @GetMapping("/import/getPurchaseSampleProductById")
    @ResponseBody
    public R getPurchaseSampleProductById(Integer id) {
        try {
            LOGGER.info("仓库管理-资源样品-通过采购样品主ID获取对应产品信息 id=" + id);
            List<ImportPurchaseSampleProductRsp> productList = resourceSamplesService.getPurchaseSampleProductById(id);
            return R.build(productList);
        } catch (Exception e) {
            LOGGER.info("仓库管理-资源样品-通过采购样品主ID获取对应产品信息异常:" + e);
            return R.buildError(ResultStatusEnum.SYSTEM_ERROR);
        }
    }

    /**
     * 通过采购单号获取已做样品登记数量
     *
     * @param purchaseNo 采购单号
     * @return 已做样品登记数量
     */
    @GetMapping("/getResourceSampleCountByPurchaseNo")
    @ResponseBody
    public R getResourceSampleCountByPurchaseNo(String purchaseNo) {
        try {
            LOGGER.info("仓库管理-资源样品-通过采购单号获取已做样品登记数量 purchaseNo=" + purchaseNo);
            int count = resourceSamplesService.getResourceSampleCountByPurchaseNo(purchaseNo);
            return R.build(count);
        } catch (Exception e) {
            LOGGER.info("仓库管理-资源样品-通过采购单号获取已做样品登记数量异常:" + e);
            return R.buildError(ResultStatusEnum.SYSTEM_ERROR);
        }
    }

    /**
     * 通过id获取已做样品领出数量
     *
     * @param id 单据主id
     * @return 已做样品领出数量
     */
    @GetMapping("/getSampleTakeCountById")
    @ResponseBody
    public R getSampleTakeCountById(Integer id) {
        try {
            LOGGER.info("仓库管理-资源样品-通过id获取已做样品领出数量 id=" + id);
            int count = resourceSamplesService.getSampleTakeCountById(id);
            return R.build(count);
        } catch (Exception e) {
            LOGGER.info("仓库管理-资源样品-通过id获取已做样品领出数量异常:" + e);
            return R.buildError(ResultStatusEnum.SYSTEM_ERROR);
        }
    }



    /**
     * 首页-获取库存明细统计分页信息
     * @param req 查询条件实体
     * @return
     */
    @GetMapping("/getInventoryDetailStatisticsReqListByPage")
    @ResponseBody
    public R getInventoryDetailStatisticsReqListByPage(InventoryDetailStatisticsPageReq req){
        try {
            LOGGER.info("资源样品-首页-获取库存明细统计分页信息:" + req.toString());
            PageInfo<InventoryDetailStatisticsPageVo> pageInfo = resourceSamplesService.getInventoryDetailStatisticsReqListByPage(req);
            return R.build(0,"", pageInfo.getTotal(), pageInfo.getList());
        }catch (Exception e){
            LOGGER.info("资源样品-首页-获取库存明细统计分页信息异常:" + e);
            return R.buildError(ResultStatusEnum.SYSTEM_ERROR);
        }
    }

    /**
     * 首页-获取库存明细统计--导出信息
     * @param req 查询条件实体
     * @return
     */
    @GetMapping("/getInventoryDetailStatisticsReqListExport")
    @ResponseBody
    public R getInventoryDetailStatisticsReqListExport(InventoryDetailStatisticsPageReq req){
        try {
            LOGGER.info("资源样品-首页-获取库存明细统计导出信息:" + req.toString());
            JSONObject obj = resourceSamplesService.getInventoryDetailStatisticsReqListExport(req);
            return R.build(obj);
        }catch (Exception e){
            LOGGER.info("资源样品-首页-获取库存明细统计导出信息异常:" + e);
            return R.buildError(ResultStatusEnum.SYSTEM_ERROR);
        }
    }
}
